package tfc_editor.GUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;

import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JTextArea;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import tfc_editor.OnLFileManagement.OnLineDirectory;
import tfc_editor.OnLFileManagement.OnLineFileEntry;
import tfc_editor.OnLFileManagement.OnLineFileReader;
import tfc_editor.OnLFileManagement.OnLineFileWriter;
import tfc_editor.pastrytools.PastryManager;
import tfc_editor.userManagement.UserUtils;

/**
* Clase encarregada de gestionar la finestra on podem carregar i guardar fitxers, que a mes a mes poden
* estar al directori de l'usuari o al directori compartit.
* @author Ismael Gonzalez Burgos
*/
public class FinestraGestioFitxerOnLine extends FinestraTFC  implements ActionListener, ListSelectionListener
{
	private static final long serialVersionUID = 1L;
	private PastryManager pm;
	private boolean Saving;
	private boolean Shared;
	private OnLineDirectory od;
	private JTextArea output;
	private String[] cads;
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JList jList1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextField jTextField1;

    /**
     * Constructor de la clase.
     * @param PM Punter a la clase PastryManager.
     * @param save Indica si volem desar un fitxer (true) o carregar-ho (false).
     * @param shared Indica si ho farem al directori de l'usuari o be al directori compartit.
     * @param parentEditor Punter a l'editor pare de la finestra.
     */
	public FinestraGestioFitxerOnLine(PastryManager PM,boolean save,boolean shared,EditorGUI parentEditor)
	{
		super(parentEditor);
		output = parentEditor.GetTextArea();
		Entrar();

		Saving = save;
		Shared = shared;
		pm = PM;
		initComponents();
	}

	/**
	 * Funcio que guarda un fitxer la xarxa.
	 * @param ondir Punter al directori en el que volem guardar el fitxer. 
	 * @param Shared Indica si aquest directori es el directori compartit o no.
	 */
	public void GuardarFitxer(OnLineDirectory ondir,boolean Shared)
	{
		boolean FileExists = false;
		FileExists = ondir.FileExists(jTextField1.getText());
		boolean SobreEscriureFitxer = false;
		if (FileExists)
		{
			System.out.println("El fitxer existeix. Preguntarem per sobreescriptura");
			int Ret = JOptionPane.showConfirmDialog(this,"Es segur que vol sobreesciure el fitxer " + jTextField1.getText() + "?",
					"SobreEsciureFitxer",JOptionPane.YES_NO_OPTION,JOptionPane.INFORMATION_MESSAGE);
			if (Ret == JOptionPane.YES_OPTION)
			{
				System.out.println("L'usuari vol sobreescriure el fitxer");
				SobreEscriureFitxer = true;
			}						
		}

		if (!FileExists || (SobreEscriureFitxer))
		{
			if (!FileExists)
			{
				System.out.println("Afegim el fitxer");
				Calendar calendari = Calendar.getInstance();
				int hora = calendari.get(Calendar.HOUR_OF_DAY);
				int minut = calendari.get(Calendar.MINUTE);
				int segon = calendari.get(Calendar.SECOND);
				int dia = calendari.get(Calendar.DAY_OF_MONTH);
				int mes = calendari.get(Calendar.MONTH);
				int any = calendari.get(Calendar.YEAR);
				
				String time = "|" + hora;
				while (time.length()<3)
					time += " ";
				time += ":" + minut;
				while (time.length()<6)
					time += " ";
				time += ":" + segon;
				while (time.length()<9)
					time += " ";
				time += "|";
				
				junit.framework.Assert.assertTrue(time.length()==10);
				
				String date = "|" + dia;
				while (date.length()<3)
					date += " ";
				date += "/" + mes;
				while (date.length()<6)
					date += " ";
				date += "/" + any;
				while (date.length()<11)
					date += " ";
				
				// Intentarem escapar de l'efecte 10000 :)
				if (date.length()>11)
					date = date.substring(0,11);

				date += "|";

				junit.framework.Assert.assertTrue(date.length()==12);
				
				OnLineFileEntry ofe = new OnLineFileEntry(jTextField1.getText(),date,time);
				ondir.AddFileToDirectory(ofe);
				if (Shared)
					ondir.SaveDirectoryShared();
				else
					ondir.SaveDirectory(UserUtils.ActiveUser);
			}

			OnLineFileWriter ofw = new OnLineFileWriter();
			if (Shared)
				ofw.WriteFileShared(jTextField1.getText(),output.getText(),pm);
			ofw.WriteFileUser(jTextField1.getText(),output.getText(),UserUtils.ActiveUser,pm);
			parentEditor.SetTextModified(false);
			parentEditor.SetFileName(jTextField1.getText());			
		}
	}

	/**
	 * Inicialitza els components de la finestra.
	 */
    private void initComponents()
    {
        jLabel1 = new javax.swing.JLabel();
        jTextField1 = new javax.swing.JTextField();
        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        jList1 = new javax.swing.JList();
        jList1.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

		if (Shared)
		{
			od = new OnLineDirectory(pm);
			od.LoadSharedDirectory();
			cads = new String[od.GetNumFiles()];
			for (int i=0;i<od.GetNumFiles();i++)
			{
				cads[i] = new String(od.GetFileEntryFromIndex(i).GetName());
			}
		}
		else
		{
			od = new OnLineDirectory(pm);
			od.LoadDirectoryFromUser(UserUtils.ActiveUser);
			cads = new String[od.GetNumFiles()];
			for (int i=0;i<od.GetNumFiles();i++)
			{
				cads[i] = new String(od.GetFileEntryFromIndex(i).GetName());
			}
		}

        jList1 = new javax.swing.JList(cads);
        jScrollPane1.setViewportView(jList1);

        jLabel2.setText("Directori:");
		jLabel1.setText("File:");
		jTextField1.setText("");

		if (Saving)
		{
			String title = "Desar fitxer";
			if (Shared)
				title += " al directori compartit";
			else
				title += " al directori del usuari " + UserUtils.ActiveUser.GetLogin();
			
			setTitle(title);
			jLabel1.setText("Fitxers:");
			jButton1.setText("Desar");
		}
		else
		{
			String title = "Carregar fitxer";
			if (Shared)
				title += " del directori compartit";
			else
				title += " del directori del usuari " + UserUtils.ActiveUser.GetLogin();
			
			setTitle(title);
			jLabel1.setText("Fitxer a carregar:");
			jButton1.setText("Carregar");
		}
		jButton2.setText("Cancelar");

		jButton1.addActionListener(this);
		jButton2.addActionListener(this);
        jList1.addListSelectionListener(this);

        jTextField1.addKeyListener(new java.awt.event.KeyAdapter()
        {
            public void keyReleased(java.awt.event.KeyEvent evt)
            {
            }
            public void keyPressed(java.awt.event.KeyEvent evt)
            {
            }
            public void keyTyped(java.awt.event.KeyEvent evt)
            {
            	if (jTextField1.getText().length()>UserUtils.FILENAME_MAX_LEN)
            	{
            		jTextField1.setText(jTextField1.getText().substring(0,UserUtils.FILENAME_MAX_LEN));
            	}
            }
        });        

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jButton1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 595, Short.MAX_VALUE)
                        .addComponent(jButton2))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jLabel2))
                            .addGroup(layout.createSequentialGroup()
                                .addGap(20, 20, 20)
                                .addComponent(jLabel1)))
                        .addGap(73, 73, 73)
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, 512, Short.MAX_VALUE)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 512, Short.MAX_VALUE))))
                .addContainerGap())
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addGap(28, 28, 28)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addContainerGap(15, Short.MAX_VALUE))
        );

        pack();
        InitC();
    }
		
    /**
     * Funcio per a setejar el nom del fitxer a carregar o desar. 	
     * @param Name Nom del fitxer.
     */
    public void SetFileName(String Name)
	{
		jTextField1.setText(Name);
	}

    /**
     * Funcio que s'executa quan premem el boto d'accio. Intentara carregar o guardar el fitxer indicat.
     */
	public void ButtonActionPressed()
	{
		junit.framework.Assert.assertFalse(jTextField1.getText().equals(""));

		if (Saving)
		{
			GuardarFitxer(od,Shared);
		}
		else
		{
			if (od.FileExists(jTextField1.getText()))
			{
				OnLineFileReader ofr = new OnLineFileReader();
				if (Shared)
					ofr.ReadFileShared(output,jTextField1.getText(),pm);
				else
					ofr.ReadFileUser(output,jTextField1.getText(),UserUtils.ActiveUser,pm);
				parentEditor.SetTextModified(false);
				parentEditor.SetFileName(jTextField1.getText());
			}
			else
				JOptionPane.showMessageDialog(this,"El fitxer " + jTextField1.getText() + " no existeix","Error al carregar el fitxer compartit",JOptionPane.ERROR_MESSAGE);
		}

		Sortir();
	}

	/**
	 * Funcio que gestiona els events rebuts pels controls de la finestra registrats.
	 * @param arg0 Event que ha generat la crida.
	 */
	public void actionPerformed(ActionEvent arg0)
	{
		if (arg0.getSource()==jButton1)
    	{
			ButtonActionPressed();
    	}
		else if (arg0.getSource()==jButton2)
		{
			Sortir();
		}
	}

	/**
	 * Funcio que posa al TextField la cadena amb el nom del fitxer seleccionat.
	 * @param list Llista on a estat seleccionat el fitxer.
	 * @param odw Directori online on treballem.
	 */
	public void SetSelectedFile(JList list,OnLineDirectory odw)
	{
		int index = list.getSelectedIndex();
		if (index <= odw.GetNumFiles())
		{
			jTextField1.setText(odw.GetFileEntryFromIndex(index).GetName());
		}
	}

	/**
	 * Funcio que s'executa que es canvia el valor seleccionat a una de les llistes.
	 * @param e Event que ha provocat el canvi.
	 */
	public void valueChanged(ListSelectionEvent e)
	{
		if (e.getSource()==jList1)
		{
			SetSelectedFile(jList1,od);
		}
	}
}
